package model

import (
	"time"
)

// TEmployeeOrganizationRel 对应 T_EMPLOYEE_ORGANIZATION_REL 表，作为人员关联核心表
type TEmployeeOrganizationRel struct {
	ID               int       `gorm:"column:ID;primaryKey;type:INT;IDENTITY(1,1);comment:自增主键ID" json:"id"`
	OrganizationCode string    `gorm:"column:ORGANIZATION_CODE;type:VARCHAR(255)" json:"organization_code"`
	EmployeeCode     string    `gorm:"column:EMPLOYEE_CODE;type:VARCHAR(255);unique;comment:员工唯一标识，用于关联权限等" json:"employee_code"`
	CreateUserID     int64     `gorm:"column:CREATE_USER_ID;type:INT" json:"create_user_id"`
	CreateTime       time.Time `gorm:"column:CREATE_TIME;type:DATETIME" json:"create_time"`
	UpdateUserID     int64     `gorm:"column:UPDATE_USER_ID;type:INT" json:"update_user_id"`
	UpdateTime       time.Time `gorm:"column:UPDATE_TIME;type:DATETIME" json:"update_time"`
	SysOrgCode       int64     `gorm:"column:SYS_ORG_CODE;type:INT" json:"sys_org_code"`
	DataStatus       string    `gorm:"column:DATA_STATUS;type:VARCHAR(255)" json:"data_status"`
	LogicStatus      string    `gorm:"column:LOGIC_STATUS;type:VARCHAR(255)" json:"logic_status"`
}

// TableName 设置表名
func (TEmployeeOrganizationRel) TableName() string {
	return "T_EMPLOYEE_ORGANIZATION_REL"
}

// TEmployee 人员核心表（使用自增 ID 作为关联依据）
type TEmployee struct {
	ID                 int       `gorm:"column:ID;primaryKey;type:INT;IDENTITY(1,1);comment:自增主键ID" json:"id"`
	Code               string    `gorm:"column:CODE;type:VARCHAR(255);unique;comment:人员唯一编码" json:"code"`
	Name               string    `gorm:"column:NAME;type:VARCHAR(255)" json:"name"`
	Gender             string    `gorm:"column:GENDER;type:VARCHAR(255)" json:"gender,omitempty"`
	Birthday           string    `gorm:"column:BIRTHDAY;type:VARCHAR(255)" json:"birthday,omitempty"`
	ContactInformation string    `gorm:"column:CONTACT_INFORMATION;type:VARCHAR(255)" json:"contact_information,omitempty"`
	IDCardNo           string    `gorm:"column:ID_CARD_NO;type:VARCHAR(255);unique;comment:身份证号（唯一）" json:"id_card_no,omitempty"`
	CreateUserID       int64     `gorm:"column:CREATE_USER_ID;type:INT" json:"create_user_id"`
	CreateTime         time.Time `gorm:"column:CREATE_TIME;type:DATETIME" json:"create_time"`
	UpdateUserID       int64     `gorm:"column:UPDATE_USER_ID;type:INT" json:"update_user_id"`
	UpdateTime         time.Time `gorm:"column:UPDATE_TIME;type:DATETIME" json:"update_time"`
	SysOrgCode         int64     `gorm:"column:SYS_ORG_CODE;type:INT" json:"sys_org_code"`
	DataStatus         string    `gorm:"column:DATA_STATUS;type:VARCHAR(255)" json:"data_status"`
	LogicStatus        string    `gorm:"column:LOGIC_STATUS;type:VARCHAR(255)" json:"logic_status"`
	B64OriginData      string    `gorm:"column:B64_ORIGIN_DATA;type:VARCHAR(5000)" json:"b64_origin_data,omitempty"`
	B64SignedMessage   string    `gorm:"column:B64_SIGNED_MESSAGE;type:VARCHAR(5000)" json:"b64_signed_message,omitempty"`
}

func (TEmployee) TableName() string {
	return "T_EMPLOYEE"
}

type OrganizationStruct struct {
	ID            int64     `gorm:"column:ID;primaryKey;type:INT;comment:主键ID" json:"id"`
	OrgName       string    `gorm:"column:ORG_NAME;type:VARCHAR(255)" json:"org_name"`               // 已统一为驼峰命名
	OrgCode       string    `gorm:"column:ORG_CODE;type:VARCHAR(255)" json:"org_code"`               // 修正为驼峰命名
	ParentCode    string    `gorm:"column:PARENT_CODE;type:VARCHAR(255)" json:"parent_code"`         // 修正为驼峰命名
	OrgLevel      string    `gorm:"column:ORG_LEVEL;type:VARCHAR(255)" json:"org_level"`             // 修正为驼峰命名
	OrgSort       string    `gorm:"column:ORG_SORT;type:VARCHAR(255)" json:"org_sort"`               // 修正为驼峰命名
	Type          string    `gorm:"column:TYPE;type:VARCHAR(255)" json:"type"`                       // 修正为驼峰命名
	CreateUserId  int64     `gorm:"column:CREATE_USER_ID;type:INT" json:"create_user_id"`            // 修正为驼峰命名
	CreateTime    time.Time `gorm:"column:CREATE_TIME;type:DATETIME" json:"create_time"`             // 修正为驼峰命名
	UpdateUserId  int64     `gorm:"column:UPDATE_USER_ID;type:INT" json:"update_user_id"`            // 修正为驼峰命名
	UpdateTime    time.Time `gorm:"column:UPDATE_TIME;type:DATETIME" json:"update_time"`             // 修正为驼峰命名
	SysOrgCode    int64     `gorm:"column:SYS_ORG_CODE;type:INT" json:"sys_org_code"`                // 修正为驼峰命名
	DataStatus    string    `gorm:"column:DATA_STATUS;type:VARCHAR(255)" json:"data_status"`         // 修正为驼峰命名
	LogicStatus   string    `gorm:"column:LOGIC_STATUS;type:VARCHAR(255)" json:"logic_status"`       // 修正为驼峰命名
	ShortFormName string    `gorm:"column:SHORT_FORM_NAME;type:VARCHAR(500)" json:"short_form_name"` // 修正为驼峰命名
}

// TableName 指定表名映射
func (OrganizationStruct) TableName() string {
	return "T_ORGANIZATION"
}

// Permission 权限表（通过人员 ID 关联 TEmployee）
type Permission struct {
	BaseModel
	PermissionID   string     `gorm:"column:PERMISSION_ID;unique;not null;size:50;comment:权限唯一标识（如perm_001）" json:"permission_id"`
	EmployeeID     int64      `gorm:"column:EMPLOYEE_ID;not null;index;comment:关联人员 ID（外键关联T_EMPLOYEE.ID）" json:"employee_id"`
	PermissionType string     `gorm:"column:PERMISSION_TYPE;not null;size:20;comment:权限类型（super/admin/normal/temp_admin）" json:"permission_type"`
	EffectiveTime  *time.Time `gorm:"column:EFFECTIVE_TIME;type:DATETIME;comment:权限生效时间（半超管临时权限用）" json:"effective_time,omitempty"`
	ExpireTime     *time.Time `gorm:"column:EXPIRE_TIME;type:DATETIME;comment:权限过期时间（半超管临时权限用）" json:"expire_time,omitempty"`

	// 外键关联（序列化时忽略）
	Employee TEmployee `gorm:"foreignKey:EmployeeID;references:ID;constraint:OnDelete:CASCADE" json:"-"`
}

func (Permission) TableName() string {
	return "PERMISSIONS"
}

type KeyPermission struct {
	BaseModel
	KeyID           string `gorm:"column:KEY_ID;unique;not null;size:50;comment:密钥唯一标识（如key_001）" json:"key_id"`
	TaskID          string `gorm:"column:TASK_ID;not null;index;comment:关联任务ID（外键关联task.task_code）" json:"task_id"`
	ThirdPartyName  string `gorm:"column:THIRD_PARTY_NAME;not null;size:100;comment:第三方名称（如智能体A）" json:"third_party_name"`
	KeyValue        string `gorm:"column:KEY_VALUE;not null;size:255;comment:对接密钥（加密存储）" json:"key_value,omitempty"` // 加密字段序列化时可忽略
	PermissionScope string `gorm:"column:PERMISSION_SCOPE;not null;size:20;comment:权限范围（read/write/operate）" json:"permission_scope"`
	Status          bool   `gorm:"column:STATUS;type:INT;default:1;comment:密钥状态（1=启用，0=禁用）" json:"status"`

	// 外键关联（序列化时忽略）
	Task Task `gorm:"foreignKey:TaskID;references:TaskCode;constraint:OnDelete:CASCADE" json:"-"`
}

func (KeyPermission) TableName() string {
	return "KEY_PERMISSIONS"
}
